import 'dart:math';

import 'package:intl/intl.dart';

import '../app_utils.dart';

extension CUNumExt on num {
  /// 屏幕宽度的几倍
  /// 0.5.sw : 屏幕宽度的一半
  /// 1.sw：屏幕宽度
  double get sw => AppUtils.width * this;

  /// 屏幕高度的几倍
  /// 0.5.sh : 屏幕高度的一半
  /// 1.sh：屏幕高度
  double get sh => AppUtils.height * this;

  /// 保留小数后几位位，四舍五入
  /// 10.0 -->10
  /// 10.1 -->10.1
  /// 10.88 -->10.9
  /// @param isJumpInt 整数的时候直接返回
  String toFormat45([int wei = 1, bool isJumpInt = false]) {
    if (wei < 0) {
      throw ArgumentError('小数位数不能为负数');
    }
    if (isJumpInt && (this is int)) {
      return toString();
    }
    final format = NumberFormat(
      "#${wei > 0 ? ".${List.filled(wei, '#').join()}" : ''}",
      'zh_CN',
    );
    // 设置舍入模式为 HALF_UP
    format.minimumFractionDigits = 0;
    format.maximumFractionDigits = wei;
    return format.format(this);
  }

  /// 保留小数后几位位，四舍五入, 这里保留0
  /// 10.0 -->10.0
  /// 10.1 -->10.1
  /// 10.88 -->10.9
  /// @param isJumpInt 整数的时候直接返回
  String toFormat45Or0([int wei = 1, bool isJumpInt = false]) {
    if (wei < 0) {
      throw ArgumentError('小数位数不能为负数');
    }
    if (isJumpInt && (this is int)) {
      return toString();
    }
    // final format = NumberFormat(
    //   "0${wei > 0 ? ".${List.filled(wei, '0').join()}" : ''}",
    //   'zh_CN',
    // );
    // // 设置舍入模式为 HALF_UP
    // format.minimumFractionDigits = wei;
    // format.maximumFractionDigits = wei;
    // return format.format(this);
    return toStringAsFixed(wei);
  }

  //截断小数，保留N位小数
  String toTruncate([int wei = 1]) {
    if (wei < 0) {
      throw ArgumentError('小数位数不能为负数');
    }
    if (wei == 0) {
      return toInt().toString();
    }
    final mod = pow(10, wei);
    return ((this * mod).truncateToDouble() / mod).toString();
  }

  // 判断是否包含小数部分
  bool hasDecimalPart() {
    if (isInfinite || isNaN) {
      // 无穷大或NaN视为无小数
      return false;
    }
    num fractionalPart = (this % 1).abs();
    return fractionalPart != 0;
  }

  /// 加法（返回 double 类型）
  num plus(num other) => this + other;

  /// 减法（返回 double 类型）
  num minus(num other) => this - other;

  /// 乘法（返回 double 类型）
  num times(num other) => this * other;

  /// 除法（自动处理除零异常）
  num div(num other, {num def = 0}) {
    if (other == 0) return def;
    return this / other;
  }

  /// 取余（兼容 int 和 double）
  num modulo(num other) => this % other;
}

extension CUIntExt on int? {
  int orEmpty() {
    return this ?? 0;
  }
}

extension CUDoubleExt on double? {
  double orEmpty() {
    return this ?? 0;
  }
}

extension CUDoubleNoNullExt on double {
  // 四舍五入
  // print(3.14159.roundTo(2)); // 3.14
  // print(3.145.roundTo(2)); // 3.15
  // print(10.7.roundTo(0)); // 11.0
  // print(-5.6789.roundTo(3)); // -5.679
  // print(123.456.roundTo(1)); // 123.5
  double roundTo([int wei = 1]) {
    if (wei < 0) {
      throw ArgumentError('小数位数不能为负数');
    }
    if (isNaN || isInfinite) {
      return this; // 直接返回 NaN 或无穷大
    }
    double factor = pow(10, wei).toDouble();
    return (this * factor).roundToDouble() / factor;
  }
}

main() {
  num? aaa = 20;
  Map<String, String> map = {};
  map["ddd"] = "www";
  final ddd = map["ddd"] ??= "ddd";
  print(map);
  print(ddd);
  print(aaa.times(2));
  print("toFormat45");
  print(10.129.toFormat45(0));
  print(10.129.toFormat45(2));
  print("toTruncate");
  print(10.129.toTruncate(0));
  print(10.129.toTruncate(2));
  print(3.14159.roundTo(2)); // 3.14
  print(3.145.roundTo(2)); // 3.15
  print(10.7.roundTo(0)); // 11.0
  print(-5.6789.roundTo(3)); // -5.679
  print(123.456.roundTo(1)); // 123.5
}
